home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C++ / Applications / PICSee Dust 1.01 / Quaternary Source / TimerUtils.cpp < prev    next >
Text File  |  1995-11-13  |  4KB  |  172 lines

  1. /*
  2.     TimerUtils.cpp
  3.     
  4.     Version History:
  5.         2.0    Nov 5 95 HTD
  6.             Updated file for PowerPC compatibility and add StartTimerFPS(),
  7.             a much easier method for starting the timer (pass the max speed
  8.             in terms of <frames per second> instead of passing a constant).
  9.  
  10.     -------------------------------
  11.      
  12.     Usage:
  13.         A typical way to use TimerUtils is as follows:
  14.         
  15.         StartTimer(kTimerRate30fps);    // Or use StartTimerFPS
  16.         do {
  17.             if (TimerDoNow()) {
  18.                 // Do your thing...
  19.                 AnimateNextFrame();
  20.  
  21.                 ResetTimer();
  22.             }
  23.         }
  24.         StopTimer();
  25. */
  26.  
  27. #include <Timer.h>            // Required Time Manager interfaces
  28. #include "TimerUtils.h"
  29.  
  30. // ---------------------------------------------------------------------------
  31.  
  32. typedef struct {
  33.     TMTask atmTask;
  34.     long tmWakeUp;
  35.     long tmReserved;
  36.     long tmRefCon;
  37. } TimerInfo, *TimerInfoPtr, **TimerInfoHdl;
  38.  
  39. // --------------------------------------------------------------------------
  40.  
  41. static TimerInfo gTimerInfoTask;
  42.  
  43. static volatile short    sIterationDelay = 0;        // In milliseconds
  44. static short            sIterationDelaySave = 0;
  45. volatile Boolean        gTimeNow = true;
  46. static TimerUPP            sTimerProc = NULL;
  47.  
  48. // --------------------------------------------------------------------------
  49. // --------------------------------------------------------------------------
  50.  
  51. #ifdef powerc
  52. pascal void TimerTaskUpdater(TimerInfoPtr recPtr);
  53. #else
  54. pascal void TimerTaskUpdater();
  55. #endif
  56.  
  57. void InstallTimerTask();
  58.  
  59. #ifdef powerc
  60.     // nothing
  61. #else
  62. pascal TimerInfoPtr GetTimerInfoTask() = { 0x2E89 };
  63. #endif
  64.  
  65. // --------------------------------------------------------------------------
  66.  
  67. // TaskUpdater.
  68. // Gets called once the delayed time is up. Just sets the global time
  69. // variable, gTimeNow to true, resets the time delay for the next
  70. // time task, and inserts itself into the time manager
  71. // queue again so it gets called repeatedly.
  72.  
  73. #ifdef powerc
  74. pascal void TimerTaskUpdater(TimerInfoPtr recPtr) {
  75. #else
  76. pascal void TimerTaskUpdater() {
  77.     long            oldA5;
  78.     TimerInfoPtr    recPtr;
  79.     
  80.     recPtr    = GetTimerInfoTask();
  81.     oldA5    = SetA5(recPtr->tmRefCon);
  82. #endif
  83.  
  84.     // Core stuff right here...
  85.     gTimeNow = true;
  86.     PrimeTime((QElemPtr)recPtr, sIterationDelay);
  87.  
  88. #ifdef powerc
  89.     // nothing
  90. #else
  91.     oldA5 = SetA5(oldA5);
  92. #endif
  93. } // END TimerTaskUpdater
  94.  
  95. // --------------------------------------------------------------------------
  96.  
  97. // InstallTimerTask.
  98. // Installs the time task into the time manager queue initially and sets
  99. // the delay time between called tasks.
  100.  
  101. void InstallTimerTask() {
  102.     if (sIterationDelay == kTimerRateOff) {
  103.         gTimeNow = true;    // will always remain true so routines will run as
  104.         return;                // fast as the machine can run. Do not call Timer Manager.
  105.     }
  106.  
  107.     if (sTimerProc == NULL) {
  108.         // Keep it static so if we're on PowerPC we only
  109.         // allocate the RoutineDescriptor *once*
  110.         sTimerProc = NewTimerProc(TimerTaskUpdater);
  111.     }
  112.     gTimerInfoTask.atmTask.tmAddr = sTimerProc;
  113.  
  114.     gTimerInfoTask.tmWakeUp = 0;
  115.     gTimerInfoTask.tmReserved = 0;
  116.     gTimerInfoTask.tmRefCon = SetCurrentA5();
  117.  
  118.     InsTime((QElemPtr)&gTimerInfoTask);
  119.     PrimeTime((QElemPtr)&gTimerInfoTask, sIterationDelay);
  120.     gTimeNow = false;
  121. } // END InstallTimerTask
  122.  
  123. // ---------------------------------------------------------------------------
  124.  
  125. void SetTimerRate(short timerRate) {
  126.     sIterationDelay = timerRate;
  127.     gTimeNow = true;
  128. } // END SetTimerRate
  129.  
  130. short GetTimerRate() {
  131.     return(sIterationDelay);
  132. } // END GetTimerRate
  133.  
  134. void SaveTimerRate() {
  135.     sIterationDelaySave = sIterationDelay;
  136. } // END SaveTimerRate
  137.  
  138. void RestoreTimerRate() {
  139.     sIterationDelay = sIterationDelaySave;
  140. } // END RestoreTimerRate
  141.  
  142. // ---------------------------------------------------------------------------
  143.  
  144. void StartTimer() {
  145.     InstallTimerTask();
  146. } // END StartTimer
  147.  
  148. void StartTimer(short timerRate) {
  149.     SetTimerRate(timerRate);
  150.     InstallTimerTask();
  151. } // END StartTimer
  152.  
  153. void StartTimerFPS(short fps) {
  154.     SetTimerRate(1000/fps);
  155.     InstallTimerTask();
  156. } // END StartTimerFPS
  157.  
  158. void ResetTimer() {
  159.     if (sIterationDelay != kTimerRateOff)
  160.         gTimeNow = false;
  161. } // END ResetTimer
  162.  
  163. Boolean TimerDoNow() {
  164.     return(gTimeNow);
  165. } // END TimerDoNow
  166.  
  167. void StopTimer() {
  168.     if (sIterationDelay == kTimerRateOff) return;
  169.  
  170.     RmvTime((QElemPtr)&gTimerInfoTask);
  171.     gTimeNow = true;    // Reset to true; this is default.
  172. } // END StopTimer